Robuste standardfeil

Regresjon Robuste standardfeil sandwich R

Denne posten beskriver hvordan man kan beregne robuste standardfeil i R.

Øyvind Bugge Solheim https://www.oyvindsolheim.com (C-REX - Center for Research on Extremism)https://www.sv.uio.no/c-rex/english/
2022-09-19

Det er ofte nyttig å bruke robuste standardfeil når vi kjører regresjon. Jeg går ikke innpå hvorfor her, men viser raskt hvordan vi gjør dette i R og hvordan vi får det inn i en Stargazer-tabell.

Første skritt er som vanlig å laste inn nyttige pakker. Jeg har forsøkt å bruke kun tidyverse for tilrettelegging av data, lmtest for standardfeil og stargazer for å lage tabellen. Jeg bruker også konsekvent pipe: %>% fordi det er lettere å lese.

Laster inn pakker

# For databehendling
library("tidyverse")

# Utregningsprogrammer som brukes av lmtest under
library("sandwich")

# Kode for å teste
library("lmtest")

#Tabell:
library("stargazer")

Lager et eksempeldatasett

Her lager jeg et eksempeldatasett der avhengig og uavhengig variabel har en ganske sterk sammenheng, men der denne sammenhengen er avhengig av hvilket land man er i. Altså må vi lage cluster på land.

# Vi finner på et datasett med tilfeldige tall mellom 1 og 10:
datasett <-cbind(independent=sample(c(1:10,NA),1000,replace=T),
                      Country=sample(c("Norway","Sweden","Denmark","Finland"),1000,replace=T)
                      ) %>% as_tibble()

#Vi gjør om til numerisk
datasett$independent <- datasett$independent %>% as.numeric()

#Lager en avhengig variabel
datasett$dependent <- datasett$independent*(sample(c(1:100),1000,replace=T)/100)

#Lager variasjon i den avhengige variabelen som er ulik mellom ulike land
datasett$dependent[datasett$Country=="Norway"] <- datasett$independent[datasett$Country=="Norway"]*(sample(c(1:20),1000,replace=T)/100)+1
datasett$dependent[datasett$Country=="Sweden"] <- datasett$independent[datasett$Country=="Sweden"]*(sample(c(50:100),1000,replace=T)/100)-1
datasett$dependent[datasett$Country=="Denmark"] <- datasett$independent[datasett$Country=="Denmark"]*(sample(c(30:60),1000,replace=T)/100)+2

#Prøvde å lage litt systematisk variasjon i dataene, men vet ikke hvor godt dette funka:

datasett$dependent[rep(c(TRUE,FALSE,FALSE,FALSE),250)] <- datasett$dependent[rep(c(TRUE,FALSE,FALSE,FALSE),250)]*.9
datasett$independent[rep(c(TRUE,FALSE,FALSE,FALSE),250)] <- datasett$independent[rep(c(TRUE,FALSE,FALSE,FALSE),250)]-1

Kjører lineær regresjon

modell1<-lm(dependent~independent,data=datasett)

Regner ut robuste standardfeil

Her bruker vi altså modellen vi fikk over. Så spesifiserer vi hvilken type standardfeil vi vil ha. Se denne siden for mer informasjon om ulike alternativer. NB: Stata sin standardversjon av robust er ikke en god måte å beregne standardfeil på. Så ikke bruk type = "HC1" med mindre dere skal replikere noe som er gjort i Stata.

modell1_robust <- coeftest(modell1, vcov = vcovHC)

Regner ut robuste standardfeil med cluster på land

Vi kan også spesifisere at det er clustre i datasettet. For eksempel på land:

modell1_cluster <- coeftest(modell1, vcov = vcovCL, cluster = ~Country)

Lager en tabell i Stargazer

I stargazer kan du spesifisere standardfeilene med valget se =. Vi må legge inn en vektor (tallrekke) med standardfeil for hver modell. Her setter jeg NULL som den første fordi jeg ikke ønsker å endre standardfeilene i den første modellen. For de to andre spesifiserer jeg hvilke standardfeil jeg vil ha. Det gjør jeg ved å hente ut Std. Error for hver av de robuste modellene. Da får jeg ut bare standardfeilene fra hver modell.

Vi ser at det har størst effekt å clustre på land her og ikke så store konsekvenser å kjøre robuste standardfeil. Dette forårsakes selvfølgelig av at datasettet jeg lagde høyere opp hadde en sterk sammenheng mellom land og forholdet mellom avhengig og uavhengig variabel.

stargazer(list("lm"=modell1,"robust"=modell1,modell1),
          type = "html",
          column.labels = c("lm","robust","cluster"),
          dep.var.caption = "Model",
          #Her kommer standardfeilene
          se = list(NULL, 
                    modell1_robust[,"Std. Error"],
                    modell1_cluster[,"Std. Error"]
                    ))
Model
dependent
lm robust cluster
(1) (2) (3)
independent 0.436*** 0.436*** 0.436***
(0.018) (0.020) (0.137)
Constant 0.607*** 0.607*** 0.607
(0.110) (0.085) (0.602)
Observations 917 917 917
R2 0.385 0.385 0.385
Adjusted R2 0.385 0.385 0.385
Residual Std. Error (df = 915) 1.642 1.642 1.642
F Statistic (df = 1; 915) 573.685*** 573.685*** 573.685***
Note: p<0.1; p<0.05; p<0.01

Citation

For attribution, please cite this work as

Solheim (2022, Sept. 19). Solheim: Robuste standardfeil. Retrieved from https://www.oyvindsolheim.com/code/Robuste standardfeil/

BibTeX citation

@misc{solheim2022robuste,
  author = {Solheim, Øyvind Bugge},
  title = {Solheim: Robuste standardfeil},
  url = {https://www.oyvindsolheim.com/code/Robuste standardfeil/},
  year = {2022}
}